package ar.frba.utn.disenio.aterrizar.com.parte1;
import java.lang.String;

public class Fecha {
	
	//atributos
	private int dia;
	private int mes;
	private int anio;
	private int [] meses = {0,31,29,31,30,31,30,31,31,30,31,30,31};
	 
	public Fecha(){
		super();
	}
	
	public Fecha(int dia, int mes, int anio)
	{
		this();
		this.setDia(dia);
		this.setMes(mes);
		this.setAnio(anio);
	}
	
	public void convertir_a_ISO8601(String cadena)
	{
		String [] subcadenas = cadena.split("-");
		Boolean condicion = ((subcadenas[0].length()==4)&&(subcadenas[1].length()==2)&&(subcadenas[2].length()==2));
		if ((subcadenas.length == 3)&&condicion)
		{
			this.setAnio(Integer.parseInt(subcadenas[0]));
			this.setMes(Integer.parseInt (subcadenas[1]));
 			this.setDia(Integer.parseInt(subcadenas[2]));
		}
	}
	
	public void convertir_a_latino(String cadena)
	{
		String [] subcadenas = cadena.split("/");
		Boolean condicion = ((subcadenas[0].length()==2)&&(subcadenas[1].length()==2)&&(subcadenas[2].length()==4));
		if ((subcadenas.length == 3)&&condicion)
		{
			this.setAnio(Integer.parseInt(subcadenas[2]));
			this.setMes(Integer.parseInt (subcadenas[1]));
 			this.setDia(Integer.parseInt(subcadenas[0]));
		}
	}

	public void convertir_a_norteamericano(String cadena)
	{
		String [] subcadenas = cadena.split("-");
		Boolean condicion = ((subcadenas[0].length()==2)&&(subcadenas[1].length()==2)&&(subcadenas[2].length()==4));
		if ((subcadenas.length == 3)&&condicion)
		{
			this.setAnio(Integer.parseInt(subcadenas[2]));
			this.setMes(Integer.parseInt (subcadenas[0]));
 			this.setDia(Integer.parseInt(subcadenas[1]));
		}
	}
	
	public boolean esAnteriorA(Fecha fecha)
	{
		boolean resultado = false;
		if (this.getAnio()!=fecha.getAnio())
			resultado = this.getAnio()<fecha.getAnio();
		else
		{
			if (this.getMes()!=fecha.getMes())
				resultado = this.getMes()<fecha.getMes();
			else
				resultado = this.getDia()<fecha.getDia();
		}
		return resultado;
	}
	
	// Inicio de getters y setters

	public void setAnio(int anio) {
		this.anio = anio;
	}

	public int getAnio() {
		return anio;
	}

	public void setMes(int mes) {
		this.mes = mes;
	}

	public int getMes() {
		return mes;
	}

	public void setDia(int dia) {
		this.dia = dia;
	}

	public int getDia() {
		return dia;
	}

	public void setMeses(int [] meses) {
		this.meses = meses;
	}

	public int [] getMeses() {
		return meses;
	}

	//Fin de getters y setters
	
	public boolean igualA(Fecha fecha)
	{
		Boolean coincidenDias = (this.getDia() == fecha.getDia());
		Boolean coincidenMeses = (this.getMes() == fecha.getMes());
		Boolean coincidenAnios = (this.getAnio() == fecha.getAnio());
		Boolean resultado = coincidenDias && coincidenMeses && coincidenAnios;
		return resultado;
	}

	public int calcularDiferenciaEnDiasCon(Fecha otraFecha)
	{
		int diferenciaEnDias = 0;
		if(! this.igualA(otraFecha))
		{
			if(this.esAnteriorA(otraFecha))
				diferenciaEnDias = otraFecha.diasPasadosDesde(this);
			else
				diferenciaEnDias = this.diasPasadosDesde(otraFecha);
		}
		return diferenciaEnDias;
	}
	
	public int diasPasadosDesde(Fecha fechaAnterior)
	{
		int diasPasados = 0;
		if(this.getAnio()==fechaAnterior.getAnio())
			diasPasados = this.diferenciaEnDiasEntreMeses(fechaAnterior);
		else
		{
			int diasPorMesesAnioActual = this.diferenciaEnDiasEntreMeses(new Fecha(01,01,this.getAnio()));
			int diasPorMesesFaltantes = (new Fecha(31,12,fechaAnterior.getAnio())).diferenciaEnDiasEntreMeses(fechaAnterior);
			int diasPorAnios = (this.getAnio()-fechaAnterior.getAnio() - 1)*365;
			diasPasados = diasPorMesesAnioActual + diasPorMesesFaltantes + diasPorAnios;
		}
		return diasPasados;
	}
	
	public int diferenciaEnDiasEntreMeses(Fecha fechaAnterior) {
		int diasEntreMeses;
		if(fechaAnterior.getMes()!= this.getMes())
		{	
			diasEntreMeses = meses[fechaAnterior.getMes()] - fechaAnterior.getDia();
			for (int i = fechaAnterior.getMes() + 1 ; i < this.getMes() ; i++)
				diasEntreMeses += this.meses[i];
			diasEntreMeses += this.getDia();
		}
		else
			diasEntreMeses = this.getDia() - fechaAnterior.getDia();
		return diasEntreMeses;
	}

}